package demo8

import (
	"fmt"
	"runtime"
	"sync"
)

/*
	tips: 反面教材
		1. 同其他语言一样，本例使用了 共享内存来通信
		2. 在 Go 中，不要通过共享内存来通信，而应该通过通信来共享内存。
		3. 通过 channel 实现消息通信机制
*/

var counter = 0

func countNum(lock *sync.Mutex) {
	lock.Lock()
	counter++
	fmt.Println(counter)
	lock.Unlock()
}

// TestDemo82 go 的反面事例：通过共享内存来通信
func TestDemo82() {
	lock := &sync.Mutex{}

	for i := 0; i < 10; i++ {
		go countNum(lock)
	}

	for {
		lock.Lock()
		c := counter
		lock.Unlock()

		runtime.Gosched()

		if c >= 10 {
			break
		}
	}
}
